/**
 * Copyright (c) 2013 Nokia Corporation. All rights reserved. Nokia and Nokia
 * Connecting People are registered trademarks of Nokia Corporation. Oracle and
 * Java are trademarks or registered trademarks of Oracle and/or its affiliates.
 * Other product and company names mentioned herein may be trademarks or trade
 * names of their respective owners. See LICENSE.TXT for license information.
 */

package com.nokia.example.musicexplorer.data.model;

import java.util.Enumeration;
import java.util.Vector;
import java.util.Hashtable;
import java.util.Date;

import org.json.me.JSONArray;
import org.json.me.JSONException;
import org.json.me.JSONObject;
import org.tantalum.util.L;

/**
 * Defines the common properties and methods for all products.
 */
public class GenericProductModel {

    public String name;
    public String sortname;
    public String label;
    public String copyright;
    public String type;
    public int id;
    public Date streetReleaseDate;
    public CategoryModel category;
    public Vector genres;
    public Vector creators;

    /*
     * Holds the URLs that are used in retrieving image files. The images aren't
     * directly accessed but via an image cache.
     */
    private Hashtable thumbnailUrls;

    /**
     * Constructor.
     * @param obj
     */
    public GenericProductModel(JSONObject obj) {
        this.thumbnailUrls = new Hashtable();
        
        try {
            setThumbnails(obj.getJSONObject("thumbnails"));
        } catch (JSONException e1) {
            L.i("Could not initialize thumbnails in GenericProductModel.", e1.toString());
            L.i("With JSONObject", obj.toString());
        }
        
        try {
            setCategory(obj.getJSONObject("category"));
        } catch (JSONException e1) {
            L.i("Could not initialize categories in GenericProductModel.", e1.toString());
            L.i("With JSONObject", obj.toString());
        }
        
        try {
            setGenres(obj.getJSONArray("genres"));
        } catch (JSONException e1) {
            L.i("Could not initialize genres in GenericProductModel.", e1.toString());
            L.i("With JSONObject", obj.toString());
        }
        
        try {
            this.name = obj.getString("name");
            this.id = obj.getInt("id");
        } catch (JSONException e1) {
            L.i("Could not initialize name or id in GenericProductModel.", e1.toString());
            L.i("With JSONObject", obj.toString());
        }
        
        L.i("This GenericProductModel", this.toString());
    }

    /**
     * Parses thumbnail URLs.
     *
     * @param thumbnailURLs
     */
    public void setThumbnails(JSONObject urls) throws JSONException {
        Enumeration keys = urls.keys();
        String key = null;
        String url = null;
        
        while (keys.hasMoreElements()) {
            key = (String) keys.nextElement();
            url = (String) urls.get(key);
            thumbnailUrls.put(key, url);
        }
    }

    /**
     * Size is one of these strings: "50x50", "100x100", "200x200", "320x320"
     *
     * @param size
     * @return
     */
    public String getThumbnailUrl(String size) {
        if (!thumbnailUrls.containsKey(size)) {
            L.i("Given thumbnail size was not found. Size ", size);
            return null;
        }
        
        return (String) thumbnailUrls.get(size);
    }

    /**
     * Parses genres from a JSONArray that contains JSONObjects. Each JSONObject
     * represents a genre.
     *
     * @param genresAsJSONArray
     * @throws JSONException
     */
    public void setGenres(JSONArray genresAsJSONArray) throws JSONException {
        int loopMax = genresAsJSONArray.length();
        JSONObject tmpGenre;
        
        if (genres == null) {
            genres = new Vector();
        }
        
        for (int i = 0; i < loopMax; i++) {
            tmpGenre = genresAsJSONArray.getJSONObject(i);
            genres.addElement(
                    new GenreModel(
                    tmpGenre.getString("id"),
                    tmpGenre.getString("name")));
        }
    }

    /**
     * Setter for album name.
     *
     * @param n
     */
    public void setName(String n) {
        name = n;
    }

    /**
     * Parses the category from a JSONObject.
     *
     * @param categoryAsJSONObject
     * @throws JSONException
     */
    public void setCategory(JSONObject categoryAsJSONObject) throws JSONException {
        CategoryModel categoryModel = new CategoryModel();
        categoryModel.id = categoryAsJSONObject.getString("id");
        categoryModel.name = categoryAsJSONObject.getString("name");
    }

    public String getGenres() {
        String genres = "";
        if (this.genres != null) {
            int loopMax = this.genres.size();

            for (int i = 0; i < loopMax; i++) {
                genres += ((GenreModel) this.genres.elementAt(i)).name;
                if (i < loopMax - 1) {
                    genres += ", ";
                }
            }
        } else {
            L.i("Genres not initialized.", this.toString());
        }
        
        return genres;
    }
}
